package com.foodie.designpattern.singleton;

/**
 * 双检锁/双重校验锁单例（DCL，即 double-checked locking）
 */
public class DCLSingleton {
    //volatile关键字可以保证变量的可见性，有序性，即改变变量值之后马上把数据刷新到主存，避免脏读数据
    private static volatile DCLSingleton dclSingleton;

    private DCLSingleton() {
    }

    public static DCLSingleton getInstance() {
        if (dclSingleton == null) {
            //synchronized保证多线程下，同一时刻只有一个线程能执行括号中的代码
            synchronized (DCLSingleton.class) {
                dclSingleton = new DCLSingleton();
            }
        }
        return dclSingleton;
    }
}
